package com.hnit.service;



import com.baomidou.mybatisplus.core.metadata.IPage;
import com.hnit.web.bean.Coupons;
import com.hnit.web.bean.UserCoupons;

import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.util.List;

/**
 * 优惠券服务接口
 */
public interface CouponService {
    
    /**
     * 获取优惠券列表（分页）
     * @param page 页码
     * @param size 每页数量  
     * @param status 状态筛选：1-进行中 2-即将开始 3-已结束
     * @return 分页结果
     */
    IPage<Coupons> getCouponsList(Integer page, Integer size, Integer status);

    /**
     * 获取用户优惠券列表（分页）
     * @param userId 用户ID
     * @param page 页码
     * @param size 每页数量
     * @param status 状态筛选：1-未使用 2-已使用 3-已过期
     * @return 分页结果
     */
    IPage<UserCoupons> getUserCoupons(Long userId, Integer page, Integer size, Integer status);
    
    /**
     * 抢购优惠券
     * @param userId 用户ID
     * @param couponId 优惠券ID
     * @param request HTTP请求（用于获取IP等信息）
     * @return 抢购结果
     * @throws Exception 抢购异常
     */
    boolean grabCoupon(Long userId, Long couponId, HttpServletRequest request) throws Exception;
    

    
    /**
     * 检查用户是否可以抢购指定优惠券
     * @param userId 用户ID
     * @param couponId 优惠券ID
     * @return 是否可以抢购
     */
    boolean checkUserCanGrab(Long userId, Long couponId);
    
    /**
     * 获取优惠券详情
     * @param couponId 优惠券ID
     * @return 优惠券详情
     */
    Coupons getCouponDetail(Long couponId);
    
    /**
     * 获取订单可用的优惠券列表
     * @param userId 用户ID
     * @param totalAmount 订单总金额
     * @param productIds 商品ID列表
     * @return 可用优惠券列表
     */
    List<UserCoupons> getAvailableCouponsForOrder(Long userId, Double totalAmount, List<Long> productIds);
    
    /**
     * 使用优惠券
     * @param userId 用户ID
     * @param couponCode 优惠券码
     * @param orderId 订单ID
     * @return 使用结果
     */
    boolean useCoupon(Long userId, String couponCode, Long orderId);
    
    /**
     * 获取用户优惠券统计信息
     * @param userId 用户ID
     * @return 统计信息 [未使用数量, 已使用数量, 已过期数量]
     */
    int[] getUserCouponStats(Long userId);
    
    /**
     * 批量更新过期优惠券状态
     * @return 更新数量
     */
    int updateExpiredCoupons();
    
    /**
     * 预热优惠券数据到Redis缓存
     * @param couponId 优惠券ID
     */
    void warmUpCouponCache(Long couponId);
    
    /**
     * 同步Redis库存到数据库
     * @param couponId 优惠券ID
     */
    void syncStockToDatabase(Long couponId);

    /**
     * 分页查询优惠券列表（带条件筛选）
     * @param page 页码
     * @param size 每页大小
     * @param couponName 优惠券名称（模糊查询）
     * @param couponType 优惠券类型
     * @param couponStatus 优惠券状态
     * @param minAmount 最小金额
     * @param maxAmount 最大金额
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param sortBy 排序字段
     * @param sortOrder 排序方式
     * @return 分页结果
     */
    IPage<Coupons> getAllCouponsWithConditions(
            Integer page,
            Integer size,
            String couponName,
            Integer couponType,
            Integer couponStatus,
            BigDecimal minAmount,
            BigDecimal maxAmount,
            String startTime,
            String endTime,
            String sortBy,
            String sortOrder
    );

    /**
     * 创建优惠券
     * @param coupon 优惠券信息
     */
    void createCoupon(Coupons coupon);
}